home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / gnu / gas_251.zip / bin_251 / opcodes / mips-opc.c < prev    next >
C/C++ Source or Header  |  1994-09-28  |  33KB  |  594 lines

  1. /* mips.h.  Mips opcode list for GDB, the GNU debugger.
  2.    Copyright 1993 Free Software Foundation, Inc.
  3.    Contributed by Ralph Campbell and OSF
  4.    Commented and modified by Ian Lance Taylor, Cygnus Support
  5.  
  6. This file is part of GDB, GAS, and the GNU binutils.
  7.  
  8. GDB, GAS, and the GNU binutils are free software; you can redistribute
  9. them and/or modify them under the terms of the GNU General Public
  10. License as published by the Free Software Foundation; either version
  11. 1, or (at your option) any later version.
  12.  
  13. GDB, GAS, and the GNU binutils are distributed in the hope that they
  14. will be useful, but WITHOUT ANY WARRANTY; without even the implied
  15. warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
  16. the GNU General Public License for more details.
  17.  
  18. You should have received a copy of the GNU General Public License
  19. along with this file; see the file COPYING.  If not, write to the Free
  20. Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  21.  
  22. #include <stdio.h>
  23. #include "ansidecl.h"
  24. #include "opcode/mips.h"
  25.  
  26. /* Short hand so the lines aren't too long.  */
  27.  
  28. #define LDD     INSN_LOAD_MEMORY_DELAY
  29. #define LCD    INSN_LOAD_COPROC_DELAY
  30. #define UBD     INSN_UNCOND_BRANCH_DELAY
  31. #define CBD    INSN_COND_BRANCH_DELAY
  32. #define COD     INSN_COPROC_MOVE_DELAY
  33. #define CLD    INSN_COPROC_MEMORY_DELAY
  34. #define CBL    INSN_COND_BRANCH_LIKELY
  35. #define TRAP    INSN_TRAP
  36. #define SM    INSN_STORE_MEMORY
  37.  
  38. #define WR_d    INSN_WRITE_GPR_D
  39. #define WR_t    INSN_WRITE_GPR_T
  40. #define WR_31   INSN_WRITE_GPR_31       
  41. #define WR_D    INSN_WRITE_FPR_D        
  42. #define WR_T    INSN_WRITE_FPR_T
  43. #define WR_S    INSN_WRITE_FPR_S
  44. #define RD_s    INSN_READ_GPR_S         
  45. #define RD_b    INSN_READ_GPR_S         
  46. #define RD_t    INSN_READ_GPR_T         
  47. #define RD_S    INSN_READ_FPR_S         
  48. #define RD_T    INSN_READ_FPR_T         
  49. #define WR_CC    INSN_WRITE_COND_CODE
  50. #define RD_CC    INSN_READ_COND_CODE
  51. #define RD_C0   INSN_COP
  52. #define RD_C1    INSN_COP
  53. #define RD_C2   INSN_COP
  54. #define RD_C3   INSN_COP
  55. #define WR_C0   INSN_COP
  56. #define WR_C1    INSN_COP
  57. #define WR_C2   INSN_COP
  58. #define WR_C3   INSN_COP
  59. #define WR_HI    INSN_WRITE_HI
  60. #define WR_LO    INSN_WRITE_LO
  61. #define RD_HI    INSN_READ_HI
  62. #define RD_LO    INSN_READ_LO
  63.  
  64. #define I2    INSN_ISA2
  65. #define I3    INSN_ISA3
  66.  
  67. /* The order of overloaded instructions matters.  Label arguments and
  68.    register arguments look the same. Instructions that can have either
  69.    for arguments must apear in the correct order in this table for the
  70.    assembler to pick the right one. In other words, entries with
  71.    immediate operands must apear after the same instruction with
  72.    registers.
  73.  
  74.    Many instructions are short hand for other instructions (i.e., The
  75.    jal <register> instruction is short for jalr <register>).  */
  76.  
  77. const struct mips_opcode mips_opcodes[] = {
  78. /* These instructions appear first so that the disassembler will find
  79.    them first.  The assemblers uses a hash table based on the
  80.    instruction name anyhow.  */
  81. {"nop",     "",        0x00000000, 0xffffffff,    0        },
  82. {"li",      "t,j",      0x24000000, 0xffe00000, WR_t        }, /* addiu */
  83. {"li",        "t,i",    0x34000000, 0xffe00000, WR_t        }, /* ori */
  84. {"li",      "t,I",    0,    (int) M_LI,    INSN_MACRO    },
  85. {"move",    "d,s",    0x00000021, 0xfc1f07ff,    WR_d|RD_s    },/* addu */
  86. {"b",       "p",    0x10000000, 0xffff0000,    UBD        },/* beq 0,0 */
  87. {"b",       "p",    0x04010000, 0xffff0000,    UBD        },/* bgez 0 */
  88. {"bal",     "p",    0x04110000, 0xffff0000,    UBD|WR_31    },/* bgezal 0*/
  89.  
  90. {"abs",     "d,v",    0,    (int) M_ABS,    INSN_MACRO    },
  91. {"abs.s",   "D,V",    0x46000005, 0xffff003f,    WR_D|RD_S    },
  92. {"abs.d",   "D,V",    0x46200005, 0xffff003f,    WR_D|RD_S    },
  93. {"add",     "d,v,t",    0x00000020, 0xfc0007ff,    WR_d|RD_s|RD_t    },
  94. {"add",     "t,r,I",    0,    (int) M_ADD_I,    INSN_MACRO    },
  95. {"add.s",   "D,V,T",    0x46000000, 0xffe0003f,    WR_D|RD_S|RD_T    },
  96. {"add.d",   "D,V,T",    0x46200000, 0xffe0003f,    WR_D|RD_S|RD_T    },
  97. {"addi",    "t,r,j",    0x20000000, 0xfc000000,    WR_t|RD_s    },
  98. {"addiu",   "t,r,j",    0x24000000, 0xfc000000,    WR_t|RD_s    },
  99. {"addu",    "d,v,t",    0x00000021, 0xfc0007ff,    WR_d|RD_s|RD_t    },
  100. {"addu",    "t,r,I",    0,    (int) M_ADDU_I,    INSN_MACRO    },
  101. {"and",     "d,v,t",    0x00000024, 0xfc0007ff,    WR_d|RD_s|RD_t    },
  102. {"and",     "t,r,I",    0,    (int) M_AND_I,    INSN_MACRO    },
  103. {"andi",    "t,r,i",    0x30000000, 0xfc000000,    WR_t|RD_s    },
  104. /* b is at the top of the table.  */
  105. /* bal is at the top of the table.  */
  106. {"bc0f",    "p",    0x41000000, 0xffff0000,    CBD|RD_CC    },
  107. {"bc0fl",   "p",    0x41020000, 0xffff0000,    CBL|RD_CC|I2    },
  108. {"bc1f",    "p",    0x45000000, 0xffff0000,    CBD|RD_CC    },
  109. {"bc1fl",   "p",    0x45020000, 0xffff0000,    CBL|RD_CC|I2    },
  110. {"bc2f",    "p",    0x49000000, 0xffff0000,    CBD|RD_CC    },
  111. {"bc2fl",   "p",    0x49020000, 0xffff0000,    CBL|RD_CC|I2    },
  112. {"bc3f",    "p",    0x4d000000, 0xffff0000,    CBD|RD_CC    },
  113. {"bc3fl",   "p",    0x4d020000, 0xffff0000,    CBL|RD_CC|I2    },
  114. {"bc0t",    "p",    0x41010000, 0xffff0000,    CBD|RD_CC    },
  115. {"bc0tl",   "p",    0x41030000, 0xffff0000,    CBL|RD_CC|I2    },
  116. {"bc1t",    "p",    0x45010000, 0xffff0000,    CBD|RD_CC    },
  117. {"bc1tl",   "p",    0x45030000, 0xffff0000,    CBL|RD_CC|I2    },
  118. {"bc2t",    "p",    0x49010000, 0xffff0000,    CBD|RD_CC    },
  119. {"bc2tl",   "p",    0x49030000, 0xffff0000,    CBL|RD_CC|I2    },
  120. {"bc3t",    "p",    0x4d010000, 0xffff0000,    CBD|RD_CC    },
  121. {"bc3tl",   "p",    0x4d030000, 0xffff0000,    CBL|RD_CC|I2    },
  122. {"beqz",    "s,p",    0x10000000, 0xfc1f0000,    CBD|RD_s    },
  123. {"beqzl",   "s,p",    0x50000000, 0xfc1f0000,    CBL|RD_s|I2    },
  124. {"beq",     "s,t,p",    0x10000000, 0xfc000000,    CBD|RD_s|RD_t    },
  125. {"beq",     "s,I,p",    0,    (int) M_BEQ_I,    INSN_MACRO    },
  126. {"beql",    "s,t,p",    0x50000000, 0xfc000000,    CBL|RD_s|RD_t|I2},
  127. {"beql",    "s,I,p",    2,    (int) M_BEQL_I,    INSN_MACRO    },
  128. {"bge",     "s,t,p",    0,    (int) M_BGE,    INSN_MACRO    },
  129. {"bge",     "s,I,p",    0,    (int) M_BGE_I,    INSN_MACRO    },
  130. {"bgel",    "s,t,p",    2,    (int) M_BGEL,    INSN_MACRO    },
  131. {"bgel",    "s,I,p",    2,    (int) M_BGEL_I,    INSN_MACRO    },
  132. {"bgeu",    "s,t,p",    0,    (int) M_BGEU,    INSN_MACRO    },
  133. {"bgeu",    "s,I,p",    0,    (int) M_BGEU_I,    INSN_MACRO    },
  134. {"bgeul",   "s,t,p",    2,    (int) M_BGEUL,    INSN_MACRO    },
  135. {"bgeul",   "s,I,p",    2,    (int) M_BGEUL_I,    INSN_MACRO    },
  136. {"bgez",    "s,p",    0x04010000, 0xfc1f0000,    CBD|RD_s    },
  137. {"bgezl",   "s,p",    0x04030000, 0xfc1f0000,    CBL|RD_s|I2    },
  138. {"bgezal",  "s,p",    0x04110000, 0xfc1f0000,    CBD|RD_s|WR_31    },
  139. {"bgezall", "s,p",    0x04130000, 0xfc1f0000,    CBL|RD_s|I2    },
  140. {"bgt",     "s,t,p",    0,    (int) M_BGT,    INSN_MACRO    },
  141. {"bgt",     "s,I,p",    0,    (int) M_BGT_I,    INSN_MACRO    },
  142. {"bgtl",    "s,t,p",    2,    (int) M_BGTL,    INSN_MACRO    },
  143. {"bgtl",    "s,I,p",    2,    (int) M_BGTL_I,    INSN_MACRO    },
  144. {"bgtu",    "s,t,p",    0,    (int) M_BGTU,    INSN_MACRO    },
  145. {"bgtu",    "s,I,p",    0,    (int) M_BGTU_I,    INSN_MACRO    },
  146. {"bgtul",   "s,t,p",    2,    (int) M_BGTUL,    INSN_MACRO    },
  147. {"bgtul",   "s,I,p",    2,    (int) M_BGTUL_I,    INSN_MACRO    },
  148. {"bgtz",    "s,p",    0x1c000000, 0xfc1f0000,    CBD|RD_s    },
  149. {"bgtzl",   "s,p",    0x5c000000, 0xfc1f0000,    CBL|RD_s|I2    },
  150. {"ble",     "s,t,p",    0,    (int) M_BLE,    INSN_MACRO    },
  151. {"ble",     "s,I,p",    0,    (int) M_BLE_I,    INSN_MACRO    },
  152. {"blel",    "s,t,p",    2,    (int) M_BLEL,    INSN_MACRO    },
  153. {"blel",    "s,I,p",    2,    (int) M_BLEL_I,    INSN_MACRO    },
  154. {"bleu",    "s,t,p",    0,    (int) M_BLEU,    INSN_MACRO    },
  155. {"bleu",    "s,I,p",    0,    (int) M_BLEU_I,    INSN_MACRO    },
  156. {"bleul",   "s,t,p",    2,    (int) M_BLEUL,    INSN_MACRO    },
  157. {"bleul",   "s,I,p",    2,    (int) M_BLEUL_I,    INSN_MACRO    },
  158. {"blez",    "s,p",    0x18000000, 0xfc1f0000,    CBD|RD_s    },
  159. {"blezl",   "s,p",    0x58000000, 0xfc1f0000,    CBL|RD_s|I2    },
  160. {"blt",     "s,t,p",    0,    (int) M_BLT,    INSN_MACRO    },
  161. {"blt",     "s,I,p",    0,    (int) M_BLT_I,    INSN_MACRO    },
  162. {"bltl",    "s,t,p",    2,    (int) M_BLTL,    INSN_MACRO    },
  163. {"bltl",    "s,I,p",    2,    (int) M_BLTL_I,    INSN_MACRO    },
  164. {"bltu",    "s,t,p",    0,    (int) M_BLTU,    INSN_MACRO    },
  165. {"bltu",    "s,I,p",    0,    (int) M_BLTU_I,    INSN_MACRO    },
  166. {"bltul",   "s,t,p",    2,    (int) M_BLTUL,    INSN_MACRO    },
  167. {"bltul",   "s,I,p",    2,    (int) M_BLTUL_I,    INSN_MACRO    },
  168. {"bltz",    "s,p",    0x04000000, 0xfc1f0000,    CBD|RD_s    },
  169. {"bltzl",   "s,p",    0x04020000, 0xfc1f0000,    CBL|RD_s|I2    },
  170. {"bltzal",  "s,p",    0x04100000, 0xfc1f0000,    CBD|RD_s|WR_31    },
  171. {"bltzall", "s,p",    0x04120000, 0xfc1f0000,    CBL|RD_s|I2    },
  172. {"bnez",    "s,p",    0x14000000, 0xfc1f0000,    CBD|RD_s    },
  173. {"bnezl",   "s,p",    0x54000000, 0xfc1f0000,    CBL|RD_s|I2    },
  174. {"bne",     "s,t,p",    0x14000000, 0xfc000000,    CBD|RD_s|RD_t    },
  175. {"bne",     "s,I,p",    0,    (int) M_BNE_I,    INSN_MACRO    },
  176. {"bnel",    "s,t,p",    0x54000000, 0xfc000000,    CBL|RD_s|RD_t|I2},
  177. {"bnel",    "s,I,p",    2,    (int) M_BNEL_I,    INSN_MACRO    },
  178. {"break",   "",        0x0000000d, 0xffffffff,    TRAP        },
  179. {"break",   "c",    0x0000000d, 0xfc00003f,    TRAP        },
  180. {"c.f.d",   "S,T",    0x46200030, 0xffe007ff,    RD_S|RD_T|WR_CC    },
  181. {"c.f.s",   "S,T",    0x46000030, 0xffe007ff,    RD_S|RD_T|WR_CC    },
  182. {"c.un.d",  "S,T",    0x46200031, 0xffe007ff,    RD_S|RD_T|WR_CC    },
  183. {"c.un.s",  "S,T",    0x46000031, 0xffe007ff,    RD_S|RD_T|WR_CC    },
  184. {"c.eq.d",  "S,T",    0x46200032, 0xffe007ff,    RD_S|RD_T|WR_CC    },
  185. {"c.eq.s",  "S,T",    0x46000032, 0xffe007ff,    RD_S|RD_T|WR_CC    },
  186. {"c.ueq.d", "S,T",    0x46200033, 0xffe007ff,    RD_S|RD_T|WR_CC    },
  187. {"c.ueq.s", "S,T",    0x46000033, 0xffe007ff,    RD_S|RD_T|WR_CC    },
  188. {"c.olt.d", "S,T",    0x46200034, 0xffe007ff,    RD_S|RD_T|WR_CC    },
  189. {"c.olt.s", "S,T",    0x46000034, 0xffe007ff,    RD_S|RD_T|WR_CC    },
  190. {"c.ult.d", "S,T",    0x46200035, 0xffe007ff,    RD_S|RD_T|WR_CC    },
  191. {"c.ult.s", "S,T",    0x46000035, 0xffe007ff,    RD_S|RD_T|WR_CC    },
  192. {"c.ole.d", "S,T",    0x46200036, 0xffe007ff,    RD_S|RD_T|WR_CC    },
  193. {"c.ole.s", "S,T",    0x46000036, 0xffe007ff,    RD_S|RD_T|WR_CC    },
  194. {"c.ule.d", "S,T",    0x46200037, 0xffe007ff,    RD_S|RD_T|WR_CC    },
  195. {"c.ule.s", "S,T",    0x46000037, 0xffe007ff,    RD_S|RD_T|WR_CC    },
  196. {"c.sf.d",  "S,T",    0x46200038, 0xffe007ff,    RD_S|RD_T|WR_CC    },
  197. {"c.sf.s",  "S,T",    0x46000038, 0xffe007ff,    RD_S|RD_T|WR_CC    },
  198. {"c.ngle.d","S,T",    0x46200039, 0xffe007ff,    RD_S|RD_T|WR_CC    },
  199. {"c.ngle.s","S,T",    0x46000039, 0xffe007ff,    RD_S|RD_T|WR_CC    },
  200. {"c.seq.d", "S,T",    0x4620003a, 0xffe007ff,    RD_S|RD_T|WR_CC    },
  201. {"c.seq.s", "S,T",    0x4600003a, 0xffe007ff,    RD_S|RD_T|WR_CC    },
  202. {"c.ngl.d", "S,T",    0x4620003b, 0xffe007ff,    RD_S|RD_T|WR_CC    },
  203. {"c.ngl.s", "S,T",    0x4600003b, 0xffe007ff,    RD_S|RD_T|WR_CC    },
  204. {"c.lt.d",  "S,T",    0x4620003c, 0xffe007ff,    RD_S|RD_T|WR_CC    },
  205. {"c.lt.s",  "S,T",    0x4600003c, 0xffe007ff,    RD_S|RD_T|WR_CC    },
  206. {"c.nge.d", "S,T",    0x4620003d, 0xffe007ff,    RD_S|RD_T|WR_CC    },
  207. {"c.nge.s", "S,T",    0x4600003d, 0xffe007ff,    RD_S|RD_T|WR_CC    },
  208. {"c.le.d",  "S,T",    0x4620003e, 0xffe007ff,    RD_S|RD_T|WR_CC    },
  209. {"c.le.s",  "S,T",    0x4600003e, 0xffe007ff,    RD_S|RD_T|WR_CC    },
  210. {"c.ngt.d", "S,T",    0x4620003f, 0xffe007ff,    RD_S|RD_T|WR_CC    },
  211. {"c.ngt.s", "S,T",    0x4600003f, 0xffe007ff,    RD_S|RD_T|WR_CC    },
  212. {"cache",   "k,o(b)",    0xbc000000, 0xfc000000, RD_b|I3        },
  213. {"ceil.l.d", "D,S",    0x4620000a, 0xffff003f, WR_D|RD_S|I3    },
  214. {"ceil.l.s", "D,S",    0x4600000a, 0xffff003f, WR_D|RD_S|I3    },
  215. {"ceil.w.d", "D,S",    0x4620000e, 0xffff003f, WR_D|RD_S|I2    },
  216. {"ceil.w.s", "D,S",    0x4600000e, 0xffff003f, WR_D|RD_S|I2    },
  217. {"cfc0",    "t,G",    0x40400000, 0xffe007ff,    LCD|WR_t|RD_C0    },
  218. {"cfc1",    "t,G",    0x44400000, 0xffe007ff,    LCD|WR_t|RD_C1    },
  219. {"cfc1",    "t,S",    0x44400000, 0xffe007ff,    LCD|WR_t|RD_C1    },
  220. {"cfc2",    "t,G",    0x48400000, 0xffe007ff,    LCD|WR_t|RD_C2    },
  221. {"cfc3",    "t,G",    0x4c400000, 0xffe007ff,    LCD|WR_t|RD_C3    },
  222. {"ctc0",    "t,G",    0x40c00000, 0xffe007ff,    COD|RD_t|WR_CC    },
  223. {"ctc1",    "t,G",    0x44c00000, 0xffe007ff,    COD|RD_t|WR_CC    },
  224. {"ctc1",    "t,S",    0x44c00000, 0xffe007ff,    COD|RD_t|WR_CC    },
  225. {"ctc2",    "t,G",    0x48c00000, 0xffe007ff,    COD|RD_t|WR_CC    },
  226. {"ctc3",    "t,G",    0x4cc00000, 0xffe007ff,    COD|RD_t|WR_CC    },
  227. {"cvt.d.l", "D,S",    0x46a00021, 0xffff003f,    WR_D|RD_S|I3    },
  228. {"cvt.d.s", "D,S",    0x46000021, 0xffff003f,    WR_D|RD_S    },
  229. {"cvt.d.w", "D,S",    0x46800021, 0xffff003f,    WR_D|RD_S    },
  230. {"cvt.l.d", "D,S",    0x46200025, 0xffff003f,    WR_D|RD_S|I3    },
  231. {"cvt.l.s", "D,S",    0x46000025, 0xffff003f,    WR_D|RD_S|I3    },
  232. {"cvt.s.l", "D,S",    0x46a00020, 0xffff003f,    WR_D|RD_S|I3    },
  233. {"cvt.s.d", "D,S",    0x46200020, 0xffff003f,    WR_D|RD_S    },
  234. {"cvt.s.w", "D,S",    0x46800020, 0xffff003f,    WR_D|RD_S    },
  235. {"cvt.w.d", "D,S",    0x46200024, 0xffff003f,    WR_D|RD_S    },
  236. {"cvt.w.s", "D,S",    0x46000024, 0xffff003f,    WR_D|RD_S    },
  237. {"dabs",    "d,v",    3,    (int) M_DABS,    INSN_MACRO    },
  238. {"dadd",    "d,v,t",    0x0000002c, 0xfc0007ff, WR_d|RD_s|RD_t|I3},
  239. {"dadd",    "t,r,I",    3,    (int) M_DADD_I,    INSN_MACRO    },
  240. {"daddi",   "t,r,j",    0x60000000, 0xfc000000, WR_t|RD_s|I3    },
  241. {"daddiu",  "t,r,j",    0x64000000, 0xfc000000, WR_t|RD_s|I3    },
  242. {"daddu",   "d,v,t",    0x0000002d, 0xfc0007ff, WR_d|RD_s|RD_t|I3},
  243. {"daddu",   "t,r,I",    3,    (int) M_DADDU_I,    INSN_MACRO    },
  244. /* For ddiv, see the comments about div.  */
  245. {"ddiv",    "z,s,t",    0x0000001e, 0xfc00ffff, RD_s|RD_t|WR_HI|WR_LO|I3 },
  246. {"ddiv",    "d,v,t",    3,    (int) M_DDIV_3,    INSN_MACRO    },
  247. {"ddiv",    "d,v,I",    3,    (int) M_DDIV_3I,    INSN_MACRO    },
  248. /* For ddivu, see the comments about div.  */
  249. {"ddivu",   "z,s,t",    0x0000001f, 0xfc00ffff, RD_s|RD_t|WR_HI|WR_LO|I3 },
  250. {"ddivu",   "d,v,t",    3,    (int) M_DDIVU_3,    INSN_MACRO    },
  251. {"ddivu",   "d,v,I",    3,    (int) M_DDIVU_3I,    INSN_MACRO    },
  252. /* The MIPS assembler treats the div opcode with two operands as
  253.    though the first operand appeared twice (the first operand is both
  254.    a source and a destination).  To get the div machine instruction,
  255.    you must use an explicit destination of $0.  */
  256. {"div",     "z,s,t",    0x0000001a, 0xfc00ffff,    RD_s|RD_t|WR_HI|WR_LO    },
  257. {"div",     "d,v,t",    0,    (int) M_DIV_3,    INSN_MACRO    },
  258. {"div",     "d,v,I",    0,    (int) M_DIV_3I,    INSN_MACRO    },
  259. {"div.d",   "D,V,T",    0x46200003, 0xffe0003f,    WR_D|RD_S|RD_T    },
  260. {"div.s",   "D,V,T",    0x46000003, 0xffe0003f,    WR_D|RD_S|RD_T    },
  261. /* For divu, see the comments about div.  */
  262. {"divu",    "z,s,t",    0x0000001b, 0xfc00ffff,    RD_s|RD_t|WR_HI|WR_LO    },
  263. {"divu",    "d,v,t",    0,    (int) M_DIVU_3,    INSN_MACRO    },
  264. {"divu",    "d,v,I",    0,    (int) M_DIVU_3I,    INSN_MACRO    },
  265. {"dmfc0",   "t,G",    0x40200000, 0xffe007ff, LCD|WR_t|RD_C0|I3 },
  266. {"dmtc0",   "t,G",    0x40a00000, 0xffe007ff, COD|RD_t|WR_C0|WR_CC|I3 },
  267. {"dmfc1",   "t,S",    0x44200000, 0xffe007ff, LCD|WR_t|RD_S|I3 },
  268. {"dmtc1",   "t,S",    0x44a00000, 0xffe007ff, COD|RD_t|WR_S|I3 },
  269. {"dmul",    "d,v,t",    3,    (int) M_DMUL,    INSN_MACRO    },
  270. {"dmul",    "d,v,I",    3,    (int) M_DMUL_I,    INSN_MACRO    },
  271. {"dmulo",   "d,v,t",    3,    (int) M_DMULO,    INSN_MACRO    },
  272. {"dmulo",   "d,v,I",    3,    (int) M_DMULO_I,    INSN_MACRO    },
  273. {"dmulou",  "d,v,t",    3,    (int) M_DMULOU,    INSN_MACRO    },
  274. {"dmulou",  "d,v,I",    3,    (int) M_DMULOU_I,    INSN_MACRO    },
  275. {"dmult",   "s,t",    0x0000001c, 0xfc00ffff,    RD_s|RD_t|WR_HI|WR_LO|I3 },
  276. {"dmultu",  "s,t",    0x0000001d, 0xfc00ffff,    RD_s|RD_t|WR_HI|WR_LO|I3 },
  277. {"dneg",    "d,w",    0x0000002e, 0xffe007ff,    WR_d|RD_t|I3    }, /* dsub 0 */
  278. {"dnegu",   "d,w",    0x0000002f, 0xffe007ff,    WR_d|RD_t|I3    }, /* dsubu 0*/
  279. {"drem",    "z,s,t",    0x0000001e, 0xfc00ffff, RD_s|RD_t|WR_HI|WR_LO|I3 },
  280. {"drem",    "d,v,t",    3,    (int) M_DREM_3,    INSN_MACRO    },
  281. {"drem",    "d,v,I",    3,    (int) M_DREM_3I,    INSN_MACRO    },
  282. {"dremu",   "z,s,t",    0x0000001f, 0xfc00ffff, RD_s|RD_t|WR_HI|WR_LO|I3 },
  283. {"dremu",   "d,v,t",    3,    (int) M_DREMU_3,    INSN_MACRO    },
  284. {"dremu",   "d,v,I",    3,    (int) M_DREMU_3I,    INSN_MACRO    },
  285. {"dsllv",   "d,t,s",    0x00000014, 0xfc0007ff,    WR_d|RD_t|RD_s|I3},
  286. {"dsll32",  "d,w,<",    0x0000003c, 0xffe0003f, WR_d|RD_t|I3    },
  287. {"dsll",    "d,w,s",    0x00000014, 0xfc0007ff,    WR_d|RD_t|RD_s|I3}, /* dsllv */
  288. {"dsll",    "d,w,>",    0x0000003c, 0xffe0003f, WR_d|RD_t|I3    }, /* dsll32 */
  289. {"dsll",    "d,w,<",    0x00000038, 0xffe0003f,    WR_d|RD_t|I3    },
  290. {"dsrav",   "d,t,s",    0x00000017, 0xfc0007ff,    WR_d|RD_t|RD_s|I3},
  291. {"dsra32",  "d,w,<",    0x0000003f, 0xffe0003f, WR_d|RD_t|I3    },
  292. {"dsra",    "d,w,s",    0x00000017, 0xfc0007ff,    WR_d|RD_t|RD_s|I3}, /* dsrav */
  293. {"dsra",    "d,w,>",    0x0000003f, 0xffe0003f, WR_d|RD_t|I3    }, /* dsra32 */
  294. {"dsra",    "d,w,<",    0x0000003b, 0xffe0003f,    WR_d|RD_t|I3    },
  295. {"dsrlv",   "d,t,s",    0x00000016, 0xfc0007ff,    WR_d|RD_t|RD_s|I3},
  296. {"dsrl32",  "d,w,<",    0x0000003e, 0xffe0003f, WR_d|RD_t|I3    },
  297. {"dsrl",    "d,w,s",    0x00000016, 0xfc0007ff,    WR_d|RD_t|RD_s|I3}, /* dsrlv */
  298. {"dsrl",    "d,w,>",    0x0000003e, 0xffe0003f, WR_d|RD_t|I3    }, /* dsrl32 */
  299. {"dsrl",    "d,w,<",    0x0000003a, 0xffe0003f,    WR_d|RD_t|I3    },
  300. {"dsub",    "d,v,t",    0x0000002e, 0xfc0007ff,    WR_d|RD_s|RD_t|I3},
  301. {"dsub",    "d,v,I",    3,    (int) M_DSUB_I,    INSN_MACRO    },
  302. {"dsubu",   "d,v,t",    0x0000002f, 0xfc0007ff,    WR_d|RD_s|RD_t|I3},
  303. {"dsubu",   "d,v,I",    3,    (int) M_DSUBU_I,    INSN_MACRO    },
  304. {"eret",    "",        0x42000018, 0xffffffff, I3        },
  305. {"floor.l.d", "D,S",    0x4620000b, 0xffff003f, WR_D|RD_S|I3    },
  306. {"floor.l.s", "D,S",    0x4600000b, 0xffff003f, WR_D|RD_S|I3    },
  307. {"floor.w.d", "D,S",    0x4620000f, 0xffff003f, WR_D|RD_S|I2    },
  308. {"floor.w.s", "D,S",    0x4600000f, 0xffff003f, WR_D|RD_S|I2    },
  309. {"jr",      "s",    0x00000008, 0xfc1fffff,    UBD|RD_s    },
  310. {"j",       "s",    0x00000008, 0xfc1fffff,    UBD|RD_s    }, /* jr */
  311. /* SVR4 PIC code requires special handling for j, so it must be a
  312.    macro.  */
  313. {"j",        "a",    0,     (int) M_J_A,    INSN_MACRO    },
  314. /* This form of j is used by the disassembler and internally by the
  315.    assembler, but will never match user input (because the line above
  316.    will match first).  */
  317. {"j",       "a",    0x08000000, 0xfc000000,    UBD        },
  318. {"jalr",    "s",    0x0000f809, 0xfc1fffff,    UBD|RD_s|WR_d    },
  319. {"jalr",    "d,s",    0x00000009, 0xfc1f07ff,    UBD|RD_s|WR_d    },
  320. /* SVR4 PIC code requires special handling for jal, so it must be a
  321.    macro.  */
  322. {"jal",     "d,s",    0,     (int) M_JAL_2,    INSN_MACRO    },
  323. {"jal",     "s",    0,     (int) M_JAL_1,    INSN_MACRO    },
  324. {"jal",     "a",    0,     (int) M_JAL_A,    INSN_MACRO    },
  325. /* This form of jal is used by the disassembler and internally by the
  326.    assembler, but will never match user input (because the line above
  327.    will match first).  */
  328. {"jal",     "a",    0x0c000000, 0xfc000000,    UBD|WR_31    },
  329. {"la",      "t,A(b)",    0,    (int) M_LA_AB,    INSN_MACRO    },
  330. {"lb",      "t,o(b)",    0x80000000, 0xfc000000,    LDD|RD_b|WR_t    },
  331. {"lb",      "t,A(b)",    0,    (int) M_LB_AB,    INSN_MACRO    },
  332. {"lbu",     "t,o(b)",    0x90000000, 0xfc000000,    LDD|RD_b|WR_t    },
  333. {"lbu",     "t,A(b)",    0,    (int) M_LBU_AB,    INSN_MACRO    },
  334. {"ld",        "t,o(b)",   0xdc000000, 0xfc000000, WR_t|RD_b|I3    },
  335. {"ld",      "t,o(b)",    0,    (int) M_LD_OB,    INSN_MACRO    },
  336. {"ld",      "t,A(b)",    0,    (int) M_LD_AB,    INSN_MACRO    },
  337. {"ldc1",    "T,o(b)",    0xd4000000, 0xfc000000, CLD|RD_b|WR_T|I2},
  338. {"ldc1",    "E,o(b)",    0xd4000000, 0xfc000000, CLD|RD_b|WR_T|I2},
  339. {"ldc1",    "T,A(b)",    2,    (int) M_LDC1_AB,    INSN_MACRO    },
  340. {"ldc1",    "E,A(b)",    2,    (int) M_LDC1_AB,    INSN_MACRO    },
  341. {"l.d",     "T,o(b)",    0xd4000000, 0xfc000000, CLD|RD_b|WR_T|I2}, /* ldc1 */
  342. {"l.d",     "T,o(b)",    0,    (int) M_L_DOB,    INSN_MACRO    },
  343. {"l.d",     "T,A(b)",    0,    (int) M_L_DAB,    INSN_MACRO    },
  344. {"ldc2",    "E,o(b)",    0xd8000000, 0xfc000000, CLD|RD_b|WR_CC|I2},
  345. {"ldc2",    "E,A(b)",    2,    (int) M_LDC2_AB,    INSN_MACRO    },
  346. {"ldc3",    "E,o(b)",    0xdc000000, 0xfc000000, CLD|RD_b|WR_CC|I2},
  347. {"ldc3",    "E,A(b)",    2,    (int) M_LDC3_AB,    INSN_MACRO    },
  348. {"ldl",        "t,o(b)",    0x68000000, 0xfc000000, LDD|WR_t|RD_b|I3},
  349. {"ldl",        "t,A(b)",    3,    (int) M_LDL_AB,    INSN_MACRO    },
  350. {"ldr",        "t,o(b)",    0x6c000000, 0xfc000000, LDD|WR_t|RD_b|I3},
  351. {"ldr",     "t,A(b)",    3,    (int) M_LDR_AB,    INSN_MACRO    },
  352. {"lh",      "t,o(b)",    0x84000000, 0xfc000000,    LDD|RD_b|WR_t    },
  353. {"lh",      "t,A(b)",    0,    (int) M_LH_AB,    INSN_MACRO    },
  354. {"lhu",     "t,o(b)",    0x94000000, 0xfc000000,    LDD|RD_b|WR_t    },
  355. {"lhu",     "t,A(b)",    0,    (int) M_LHU_AB,    INSN_MACRO    },
  356. /* li is at the start of the table.  */
  357. {"li.d",    "t,F",    0,    (int) M_LI_D,    INSN_MACRO    },
  358. {"li.d",    "T,L",    0,    (int) M_LI_DD,    INSN_MACRO    },
  359. {"li.s",    "t,f",    0,    (int) M_LI_S,    INSN_MACRO    },
  360. {"li.s",    "T,l",    0,    (int) M_LI_SS,    INSN_MACRO    },
  361. {"ll",        "t,o(b)",    0xc0000000, 0xfc000000, LDD|RD_b|WR_t|I2},
  362. {"ll",        "t,A(b)",    2,    (int) M_LL_AB,    INSN_MACRO    },
  363. {"lld",        "t,o(b)",    0xd0000000, 0xfc000000, LDD|RD_b|WR_t|I3},
  364. {"lld",     "t,A(b)",    3,    (int) M_LLD_AB,    INSN_MACRO    },
  365. {"lui",     "t,u",    0x3c000000, 0xffe00000,    WR_t        },
  366. {"lw",      "t,o(b)",    0x8c000000, 0xfc000000,    LDD|RD_b|WR_t    },
  367. {"lw",      "t,A(b)",    0,    (int) M_LW_AB,    INSN_MACRO    },
  368. {"lwc0",    "E,o(b)",    0xc0000000, 0xfc000000,    CLD|RD_b|WR_CC    },
  369. {"lwc0",    "E,A(b)",    0,    (int) M_LWC0_AB,    INSN_MACRO    },
  370. {"lwc1",    "T,o(b)",    0xc4000000, 0xfc000000,    CLD|RD_b|WR_T    },
  371. {"lwc1",    "E,o(b)",    0xc4000000, 0xfc000000,    CLD|RD_b|WR_T    },
  372. {"lwc1",    "T,A(b)",    0,    (int) M_LWC1_AB,    INSN_MACRO    },
  373. {"lwc1",    "E,A(b)",    0,    (int) M_LWC1_AB,    INSN_MACRO    },
  374. {"l.s",     "T,o(b)",    0xc4000000, 0xfc000000,    CLD|RD_b|WR_T    }, /* lwc1 */
  375. {"l.s",     "T,A(b)",    0,    (int) M_LWC1_AB,    INSN_MACRO    },
  376. {"lwc2",    "E,o(b)",    0xc8000000, 0xfc000000,    CLD|RD_b|WR_CC    },
  377. {"lwc2",    "E,A(b)",    0,    (int) M_LWC2_AB,    INSN_MACRO    },
  378. {"lwc3",    "E,o(b)",    0xcc000000, 0xfc000000,    CLD|RD_b|WR_CC    },
  379. {"lwc3",    "E,A(b)",    0,    (int) M_LWC3_AB,    INSN_MACRO    },
  380. {"lwl",     "t,o(b)",    0x88000000, 0xfc000000,    LDD|RD_b|WR_t    },
  381. {"lwl",     "t,A(b)",    0,    (int) M_LWL_AB,    INSN_MACRO    },
  382. {"lcache",  "t,o(b)",    0x88000000, 0xfc000000,    LDD|RD_b|WR_t|I2}, /* same */
  383. {"lcache",  "t,A(b)",    2,    (int) M_LWL_AB,    INSN_MACRO    }, /* as lwl */
  384. {"lwr",     "t,o(b)",    0x98000000, 0xfc000000,    LDD|RD_b|WR_t    },
  385. {"lwr",     "t,A(b)",    0,    (int) M_LWR_AB,    INSN_MACRO    },
  386. {"flush",   "t,o(b)",    0x98000000, 0xfc000000,    LDD|RD_b|WR_t|I2}, /* same */
  387. {"flush",   "t,A(b)",    2,    (int) M_LWR_AB,    INSN_MACRO    }, /* as lwr */
  388. {"lwu",     "t,o(b)",    0x9c000000, 0xfc000000,    LDD|RD_b|WR_t|I3},
  389. {"lwu",     "t,A(b)",    3,    (int) M_LWU_AB,    INSN_MACRO    },
  390. {"mfc0",    "t,G",    0x40000000, 0xffe007ff,    LCD|WR_t|RD_C0    },
  391. {"mfc1",    "t,S",    0x44000000, 0xffe007ff,    LCD|WR_t|RD_S    },
  392. {"mfc1",    "t,G",    0x44000000, 0xffe007ff,    LCD|WR_t|RD_S    },
  393. {"mfc2",    "t,G",    0x48000000, 0xffe007ff,    LCD|WR_t|RD_C2    },
  394. {"mfc3",    "t,G",    0x4c000000, 0xffe007ff,    LCD|WR_t|RD_C3    },
  395. {"mfhi",    "d",    0x00000010, 0xffff07ff,    WR_d|RD_HI    },
  396. {"mflo",    "d",    0x00000012, 0xffff07ff,    WR_d|RD_LO    },
  397. {"mov.d",   "D,S",    0x46200006, 0xffff003f,    WR_D|RD_S    },
  398. {"mov.s",   "D,S",    0x46000006, 0xffff003f,    WR_D|RD_S    },
  399. /* move is at the top of the table.  */
  400. {"mtc0",    "t,G",    0x40800000, 0xffe007ff,    COD|RD_t|WR_C0|WR_CC    },
  401. {"mtc1",    "t,S",    0x44800000, 0xffe007ff,    COD|RD_t|WR_S    },
  402. {"mtc1",    "t,G",    0x44800000, 0xffe007ff,    COD|RD_t|WR_S    },
  403. {"mtc2",    "t,G",    0x48800000, 0xffe007ff,    COD|RD_t|WR_C2|WR_CC    },
  404. {"mtc3",    "t,G",    0x4c800000, 0xffe007ff,    COD|RD_t|WR_C3|WR_CC    },
  405. {"mthi",    "s",    0x00000011, 0xfc1fffff,    RD_s|WR_HI    },
  406. {"mtlo",    "s",    0x00000013, 0xfc1fffff,    RD_s|WR_LO    },
  407. {"mul.d",   "D,V,T",    0x46200002, 0xffe0003f,    WR_D|RD_S|RD_T    },
  408. {"mul.s",   "D,V,T",    0x46000002, 0xffe0003f,    WR_D|RD_S|RD_T    },
  409. {"mul",     "d,v,t",    0,    (int) M_MUL,    INSN_MACRO    },
  410. {"mul",     "d,v,I",    0,    (int) M_MUL_I,    INSN_MACRO    },
  411. {"mulo",    "d,v,t",    0,    (int) M_MULO,    INSN_MACRO    },
  412. {"mulo",    "d,v,I",    0,    (int) M_MULO_I,    INSN_MACRO    },
  413. {"mulou",   "d,v,t",    0,    (int) M_MULOU,    INSN_MACRO    },
  414. {"mulou",   "d,v,I",    0,    (int) M_MULOU_I,    INSN_MACRO    },
  415. {"mult",    "s,t",    0x00000018, 0xfc00ffff,    RD_s|RD_t|WR_HI|WR_LO    },
  416. {"multu",   "s,t",    0x00000019, 0xfc00ffff,    RD_s|RD_t|WR_HI|WR_LO    },
  417. {"neg",     "d,w",    0x00000022, 0xffe007ff,    WR_d|RD_t    }, /* sub 0 */
  418. {"negu",    "d,w",    0x00000023, 0xffe007ff,    WR_d|RD_t    }, /* subu 0 */
  419. {"neg.d",   "D,V",    0x46200007, 0xffff003f,    WR_D|RD_S    },
  420. {"neg.s",   "D,V",    0x46000007, 0xffff003f,    WR_D|RD_S    },
  421. /* nop is at the start of the table.  */
  422. {"nor",     "d,v,t",    0x00000027, 0xfc0007ff,    WR_d|RD_s|RD_t    },
  423. {"nor",     "t,r,I",    0,    (int) M_NOR_I,    INSN_MACRO    },
  424. {"not",     "d,v",    0x00000027, 0xfc0007ff,    WR_d|RD_s|RD_t    },/*nor d,s,0*/
  425. {"or",      "d,v,t",    0x00000025, 0xfc0007ff,    WR_d|RD_s|RD_t    },
  426. {"or",      "t,r,I",    0,    (int) M_OR_I,    INSN_MACRO    },
  427. {"ori",     "t,r,i",    0x34000000, 0xfc000000,    WR_t|RD_s    },
  428. {"rem",     "z,s,t",    0x0000001a, 0xfc00ffff,    RD_s|RD_t|WR_HI|WR_LO },
  429. {"rem",     "d,v,t",    0,    (int) M_REM_3,    INSN_MACRO    },
  430. {"rem",     "d,v,I",    0,    (int) M_REM_3I,    INSN_MACRO    },
  431. {"remu",    "z,s,t",    0x0000001b, 0xfc00ffff,    RD_s|RD_t|WR_HI|WR_LO },
  432. {"remu",    "d,v,t",    0,    (int) M_REMU_3,    INSN_MACRO    },
  433. {"remu",    "d,v,I",    0,    (int) M_REMU_3I,    INSN_MACRO    },
  434. {"rfe",     "",        0x42000010, 0xffffffff,    INSN_RFE    },
  435. {"rol",     "d,v,t",    0,    (int) M_ROL,    INSN_MACRO    },
  436. {"rol",     "d,v,I",    0,    (int) M_ROL_I,    INSN_MACRO    },
  437. {"ror",     "d,v,t",    0,    (int) M_ROR,    INSN_MACRO    },
  438. {"ror",     "d,v,I",    0,    (int) M_ROR_I,    INSN_MACRO    },
  439. {"round.l.d", "D,S",    0x46200008, 0xffff003f, WR_D|RD_S|I3    },
  440. {"round.l.s", "D,S",    0x46000008, 0xffff003f, WR_D|RD_S|I3    },
  441. {"round.w.d", "D,S",    0x4620000c, 0xffff003f, WR_D|RD_S|I2    },
  442. {"round.w.s", "D,S",    0x4600000c, 0xffff003f, WR_D|RD_S|I2    },
  443. {"sb",      "t,o(b)",    0xa0000000, 0xfc000000,    SM|RD_t|RD_b    },
  444. {"sb",      "t,A(b)",    0,    (int) M_SB_AB,    INSN_MACRO    },
  445. {"sc",        "t,o(b)",    0xe0000000, 0xfc000000, SM|RD_t|WR_t|RD_b|I2 },
  446. {"sc",        "t,A(b)",    2,    (int) M_SC_AB,    INSN_MACRO    },
  447. {"scd",        "t,o(b)",    0xf0000000, 0xfc000000, SM|RD_t|WR_t|RD_b|I3 },
  448. {"scd",        "t,A(b)",    3,    (int) M_SCD_AB,    INSN_MACRO    },
  449. {"sd",        "t,o(b)",    0xfc000000, 0xfc000000,    SM|RD_t|RD_b|I3    },
  450. {"sd",      "t,o(b)",    0,    (int) M_SD_OB,    INSN_MACRO    },
  451. {"sd",      "t,A(b)",    0,    (int) M_SD_AB,    INSN_MACRO    },
  452. {"sdc1",    "T,o(b)",    0xf4000000, 0xfc000000, SM|RD_T|RD_b|I2    },
  453. {"sdc1",    "E,o(b)",    0xf4000000, 0xfc000000, SM|RD_T|RD_b|I2    },
  454. {"sdc1",    "T,A(b)",    2,    (int) M_SDC1_AB,    INSN_MACRO    },
  455. {"sdc1",    "E,A(b)",    2,    (int) M_SDC1_AB,    INSN_MACRO    },
  456. {"sdc2",    "E,o(b)",    0xf8000000, 0xfc000000, SM|RD_C2|RD_b|I2 },
  457. {"sdc2",    "E,A(b)",    2,    (int) M_SDC2_AB,    INSN_MACRO    },
  458. {"sdc3",    "E,o(b)",    0xfc000000, 0xfc000000, SM|RD_C3|RD_b|I2 },
  459. {"sdc3",    "E,A(b)",    2,    (int) M_SDC3_AB,    INSN_MACRO    },
  460. {"s.d",     "T,o(b)",    0xf4000000, 0xfc000000, SM|RD_T|RD_b|I2    },
  461. {"s.d",     "T,o(b)",    0,    (int) M_S_DOB,    INSN_MACRO    },
  462. {"s.d",     "T,A(b)",    0,    (int) M_S_DAB,    INSN_MACRO    },
  463. {"sdl",     "t,o(b)",    0xb0000000, 0xfc000000,    SM|RD_t|RD_b|I3    },
  464. {"sdl",     "t,A(b)",    3,    (int) M_SDL_AB,    INSN_MACRO    },
  465. {"sdr",     "t,o(b)",    0xb4000000, 0xfc000000,    SM|RD_t|RD_b|I3    },
  466. {"sdr",     "t,A(b)",    3,    (int) M_SDR_AB,    INSN_MACRO    },
  467. {"seq",     "d,v,t",    0,    (int) M_SEQ,    INSN_MACRO    },
  468. {"seq",     "d,v,I",    0,    (int) M_SEQ_I,    INSN_MACRO    },
  469. {"sge",     "d,v,t",    0,    (int) M_SGE,    INSN_MACRO    },
  470. {"sge",     "d,v,I",    0,    (int) M_SGE_I,    INSN_MACRO    },
  471. {"sgeu",    "d,v,t",    0,    (int) M_SGEU,    INSN_MACRO    },
  472. {"sgeu",    "d,v,I",    0,    (int) M_SGEU_I,    INSN_MACRO    },
  473. {"sgt",     "d,v,t",    0,    (int) M_SGT,    INSN_MACRO    },
  474. {"sgt",     "d,v,I",    0,    (int) M_SGT_I,    INSN_MACRO    },
  475. {"sgtu",    "d,v,t",    0,    (int) M_SGTU,    INSN_MACRO    },
  476. {"sgtu",    "d,v,I",    0,    (int) M_SGTU_I,    INSN_MACRO    },
  477. {"sh",      "t,o(b)",    0xa4000000, 0xfc000000,    SM|RD_t|RD_b    },
  478. {"sh",      "t,A(b)",    0,    (int) M_SH_AB,    INSN_MACRO    },
  479. {"sle",     "d,v,t",    0,    (int) M_SLE,    INSN_MACRO    },
  480. {"sle",     "d,v,I",    0,    (int) M_SLE_I,    INSN_MACRO    },
  481. {"sleu",    "d,v,t",    0,    (int) M_SLEU,    INSN_MACRO    },
  482. {"sleu",    "d,v,I",    0,    (int) M_SLEU_I,    INSN_MACRO    },
  483. {"sllv",    "d,t,s",    0x00000004, 0xfc0007ff,    WR_d|RD_t|RD_s    },
  484. {"sll",     "d,w,s",    0x00000004, 0xfc0007ff,    WR_d|RD_t|RD_s    }, /* sllv */
  485. {"sll",     "d,w,<",    0x00000000, 0xffe0003f,    WR_d|RD_t    },
  486. {"slt",     "d,v,t",    0x0000002a, 0xfc0007ff,    WR_d|RD_s|RD_t    },
  487. {"slt",     "d,v,I",    0,    (int) M_SLT_I,    INSN_MACRO    },
  488. {"slti",    "t,r,j",    0x28000000, 0xfc000000,    WR_t|RD_s    },
  489. {"sltiu",   "t,r,j",    0x2c000000, 0xfc000000,    WR_t|RD_s    },
  490. {"sltu",    "d,v,t",    0x0000002b, 0xfc0007ff,    WR_d|RD_s|RD_t    },
  491. {"sltu",    "d,v,I",    0,    (int) M_SLTU_I,    INSN_MACRO    },
  492. {"sne",     "d,v,t",    0,    (int) M_SNE,    INSN_MACRO    },
  493. {"sne",     "d,v,I",    0,    (int) M_SNE_I,    INSN_MACRO    },
  494. {"sqrt.d",  "D,S",    0x46200004, 0xffff003f, WR_D|RD_S|I2    },
  495. {"sqrt.s",  "D,S",    0x46000004, 0xffff003f, WR_D|RD_S|I2    },
  496. {"srav",    "d,t,s",    0x00000007, 0xfc0007ff,    WR_d|RD_t|RD_s    },
  497. {"sra",     "d,w,s",    0x00000007, 0xfc0007ff,    WR_d|RD_t|RD_s    }, /* srav */
  498. {"sra",     "d,w,<",    0x00000003, 0xffe0003f,    WR_d|RD_t    },
  499. {"srlv",    "d,t,s",    0x00000006, 0xfc0007ff,    WR_d|RD_t|RD_s    },
  500. {"srl",     "d,w,s",    0x00000006, 0xfc0007ff,    WR_d|RD_t|RD_s    }, /* srlv */
  501. {"srl",     "d,w,<",    0x00000002, 0xffe0003f,    WR_d|RD_t    },
  502. {"sub",     "d,v,t",    0x00000022, 0xfc0007ff,    WR_d|RD_s|RD_t    },
  503. {"sub",     "d,v,I",    0,    (int) M_SUB_I,    INSN_MACRO    },
  504. {"sub.d",   "D,V,T",    0x46200001, 0xffe0003f,    WR_D|RD_S|RD_T    },     
  505. {"sub.s",   "D,V,T",    0x46000001, 0xffe0003f,    WR_D|RD_S|RD_T    },
  506. {"subu",    "d,v,t",    0x00000023, 0xfc0007ff,    WR_d|RD_s|RD_t    },
  507. {"subu",    "d,v,I",    0,    (int) M_SUBU_I,    INSN_MACRO    },
  508. {"sw",      "t,o(b)",    0xac000000, 0xfc000000,    SM|RD_t|RD_b    },
  509. {"sw",      "t,A(b)",    0,    (int) M_SW_AB,    INSN_MACRO    },
  510. {"swc0",    "E,o(b)",    0xe0000000, 0xfc000000,    SM|RD_C0|RD_b    },
  511. {"swc0",    "E,A(b)",    0,    (int) M_SWC0_AB,    INSN_MACRO    },
  512. {"swc1",    "T,o(b)",    0xe4000000, 0xfc000000,    SM|RD_T|RD_b    },
  513. {"swc1",    "E,o(b)",    0xe4000000, 0xfc000000,    SM|RD_T|RD_b    },
  514. {"swc1",    "T,A(b)",    0,    (int) M_SWC1_AB,    INSN_MACRO    },
  515. {"swc1",    "E,A(b)",    0,    (int) M_SWC1_AB,    INSN_MACRO    },
  516. {"s.s",     "T,o(b)",    0xe4000000, 0xfc000000,    SM|RD_T|RD_b    }, /* swc1 */
  517. {"s.s",     "T,A(b)",    0,    (int) M_SWC1_AB,    INSN_MACRO    },
  518. {"swc2",    "E,o(b)",    0xe8000000, 0xfc000000,    SM|RD_C2|RD_b    },
  519. {"swc2",    "E,A(b)",    0,    (int) M_SWC2_AB,    INSN_MACRO    },
  520. {"swc3",    "E,o(b)",    0xec000000, 0xfc000000,    SM|RD_C3|RD_b    },
  521. {"swc3",    "E,A(b)",    0,    (int) M_SWC3_AB,    INSN_MACRO    },
  522. {"swl",     "t,o(b)",    0xa8000000, 0xfc000000,    SM|RD_t|RD_b    },
  523. {"swl",     "t,A(b)",    0,    (int) M_SWL_AB,    INSN_MACRO    },
  524. {"scache",  "t,o(b)",    0xa8000000, 0xfc000000,    RD_t|RD_b|I2    }, /* same */
  525. {"scache",  "t,A(b)",    2,    (int) M_SWL_AB,    INSN_MACRO    }, /* as swl */
  526. {"swr",     "t,o(b)",    0xb8000000, 0xfc000000,    SM|RD_t|RD_b    },
  527. {"swr",     "t,A(b)",    0,    (int) M_SWR_AB,    INSN_MACRO    },
  528. {"invalidate", "t,o(b)",0xb8000000, 0xfc000000,    RD_t|RD_b|I2    }, /* same */
  529. {"invalidate", "t,A(b)",2,    (int) M_SWR_AB,    INSN_MACRO    }, /* as swr */
  530. {"sync",    "",        0x0000000f, 0xffffffff, I2        },
  531. {"syscall", "",        0x0000000c, 0xffffffff,    TRAP        },
  532. {"syscall", "B",    0x0000000c, 0xfc00003f,    TRAP        },
  533. {"teqi",    "s,j",    0x040c0000, 0xfc1f0000, RD_s|I2|TRAP    },
  534. {"teq",        "s,t",    0x00000034, 0xfc00003f, RD_s|RD_t|I2|TRAP },
  535. {"teq",     "s,j",    0x040c0000, 0xfc1f0000, RD_s|I2|TRAP    }, /* teqi */
  536. {"teq",     "s,I",    2,    (int) M_TEQ_I,    INSN_MACRO    },
  537. {"tgei",    "s,j",    0x04080000, 0xfc1f0000, RD_s|I2|TRAP    },
  538. {"tge",        "s,t",    0x00000030, 0xfc00003f,    RD_s|RD_t|I2|TRAP },
  539. {"tge",     "s,j",    0x04080000, 0xfc1f0000, RD_s|I2|TRAP    }, /* tgei */
  540. {"tge",        "s,I",    2,    (int) M_TGE_I,    INSN_MACRO    },
  541. {"tgeiu",   "s,j",    0x04090000, 0xfc1f0000, RD_s|I2|TRAP    },
  542. {"tgeu",    "s,t",    0x00000031, 0xfc00003f, RD_s|RD_t|I2|TRAP },
  543. {"tgeu",    "s,j",    0x04090000, 0xfc1f0000, RD_s|I2|TRAP    }, /* tgeiu */
  544. {"tgeu",    "s,I",    2,    (int) M_TGEU_I,    INSN_MACRO    },
  545. {"tlbp",    "",        0x42000008, 0xffffffff,    INSN_TLB    },
  546. {"tlbr",    "",        0x42000001, 0xffffffff,    INSN_TLB    },
  547. {"tlbwi",   "",        0x42000002, 0xffffffff,    INSN_TLB    },
  548. {"tlbwr",   "",        0x42000006, 0xffffffff,    INSN_TLB    },
  549. {"tlti",    "s,j",    0x040a0000, 0xfc1f0000,    RD_s|I2|TRAP    },
  550. {"tlt",     "s,t",    0x00000032, 0xfc00003f, RD_s|RD_t|I2|TRAP },
  551. {"tlt",     "s,j",    0x040a0000, 0xfc1f0000,    RD_s|I2|TRAP    }, /* tlti */
  552. {"tlt",     "s,I",    2,    (int) M_TLT_I,    INSN_MACRO    },
  553. {"tltiu",   "s,j",    0x040b0000, 0xfc1f0000, RD_s|I2|TRAP    },
  554. {"tltu",    "s,t",    0x00000033, 0xfc00003f, RD_s|RD_t|I2|TRAP },
  555. {"tltu",    "s,j",    0x040b0000, 0xfc1f0000, RD_s|I2|TRAP    }, /* tltiu */
  556. {"tltu",    "s,I",    2,    (int) M_TLTU_I,    INSN_MACRO    },
  557. {"tnei",    "s,j",    0x040e0000, 0xfc1f0000, RD_s|I2|TRAP    },
  558. {"tne",     "s,t",    0x00000036, 0xfc00003f, RD_s|RD_t|I2|TRAP },
  559. {"tne",     "s,j",    0x040e0000, 0xfc1f0000, RD_s|I2|TRAP    }, /* tnei */
  560. {"tne",     "s,I",    2,    (int) M_TNE_I,    INSN_MACRO    },
  561. {"trunc.l.d", "D,S",    0x46200009, 0xffff003f, WR_D|RD_S|I3    },
  562. {"trunc.l.s", "D,S",    0x46000009, 0xffff003f,    WR_D|RD_S|I3    },
  563. {"trunc.w.d", "D,S",    0x4620000d, 0xffff003f, WR_D|RD_S|I2    },
  564. {"trunc.w.d", "D,S,x",    0x4620000d, 0xffff003f, WR_D|RD_S|I2    },
  565. {"trunc.w.d", "D,S,t",    0,    (int) M_TRUNCWD,    INSN_MACRO    },
  566. {"trunc.w.s", "D,S",    0x4600000d, 0xffff003f,    WR_D|RD_S|I2    },
  567. {"trunc.w.s", "D,S,x",    0x4600000d, 0xffff003f,    WR_D|RD_S|I2    },
  568. {"trunc.w.s", "D,S,t",    0,    (int) M_TRUNCWS,    INSN_MACRO    },
  569. {"ulh",     "t,o(b)",    0,    (int) M_ULH,    INSN_MACRO    },
  570. {"ulh",     "t,A",    0,    (int) M_ULH_A,    INSN_MACRO    },
  571. {"ulhu",    "t,o(b)",    0,    (int) M_ULHU,    INSN_MACRO    },
  572. {"ulhu",    "t,A",    0,    (int) M_ULHU_A,    INSN_MACRO    },
  573. {"ulw",     "t,o(b)",    0,    (int) M_ULW,    INSN_MACRO    },
  574. {"ulw",     "t,A",    0,    (int) M_ULW_A,    INSN_MACRO    },
  575. {"ush",     "t,o(b)",    0,    (int) M_USH,    INSN_MACRO    },
  576. {"ush",     "t,A",    0,    (int) M_USH_A,    INSN_MACRO    },
  577. {"usw",     "t,o(b)",    0,    (int) M_USW,    INSN_MACRO    },
  578. {"usw",     "t,A",    0,    (int) M_USW_A,    INSN_MACRO    },
  579. {"xor",     "d,v,t",    0x00000026, 0xfc0007ff,    WR_d|RD_s|RD_t    },
  580. {"xor",     "t,r,I",    0,    (int) M_XOR_I,    INSN_MACRO    },
  581. {"xori",    "t,r,i",    0x38000000, 0xfc000000,    WR_t|RD_s    },
  582. /* No hazard protection on coprocessor instructions--they shouldn't
  583.    change the state of the processor and if they do it's up to the
  584.    user to put in nops as necessary.  These are at the end so that the
  585.    disasembler recognizes more specific versions first.  */
  586. {"c0",      "C",    0x42000000, 0xfe000000,    0        },
  587. {"c1",      "C",    0x46000000, 0xfe000000,    0        },
  588. {"c2",      "C",    0x4a000000, 0xfe000000,    0        },
  589. {"c3",      "C",    0x4e000000, 0xfe000000,    0        },
  590. };
  591.  
  592. const int bfd_mips_num_opcodes =
  593.   ((sizeof mips_opcodes) / (sizeof (mips_opcodes[0])));
  594.